home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / tm / tmerror.c < prev    next >
C/C++ Source or Header  |  1990-11-06  |  6KB  |  212 lines

  1. /* 
  2.    Copyright (C) 1990 C van Reewijk, email: dutentb.uucp!reeuwijk
  3.  
  4. This file is part of GLASS.
  5.  
  6. GLASS is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 1, or (at your option)
  9. any later version.
  10.  
  11. GLASS is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GLASS; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. /* file: tmerror.c
  21.    Error handling.
  22.  */
  23.  
  24. #include "tmdefs.h"
  25. #include <tmc.h>
  26. #include "tmds.h"
  27. #include "tmstring.h"
  28. #include "tmglobal.h"
  29. #include "debug.h"
  30. #include "tmerror.h"
  31.  
  32. extern char *strcpy();
  33. extern char *sys_errlist[];
  34. extern int sys_nerr;
  35.  
  36. char errpos[ERRARGLEN];
  37. char errarg[ERRARGLEN];
  38.  
  39. static bool goterror;      /* true if a general error has occurred */
  40.  
  41. /******************************************************
  42.  *                                                    *
  43.  *            ERROR MESSAGE TABLES                    *
  44.  *                                                    *
  45.  ******************************************************/
  46.  
  47. #define ENDTAB -1        /* end of table mark */
  48.  
  49. /* Structure for the storage of error message strings.
  50.    Arrays of these structures are used to translate
  51.    error codes to error strings.
  52.  */
  53. struct errm {
  54.    tmerrcode errmcode;    /* code of the error */
  55.    char *errmstr;    /* associated string */
  56. };
  57.  
  58. struct errm tmerrtab[] =
  59. {
  60.    { BADCONSNM  , "bad constructor name" },
  61.    { BADDOTCOM  , "unknown dot command" },
  62.    { BADEXPR    , "bad expression" },
  63.    { BADNUMBER  , "malformed number" },
  64.    { BADPADDING , "empty padding string" },
  65.    { BADPAR     , "bad parameter" },
  66.    { BADPARNO   , "bad number of parameters" },
  67.    { BADRE      , "bad regular expression" },
  68.    { BADTAG,      "bad tag" },
  69.    { BADTOK     , "bad token" },
  70.    { BADTYPENM  , "bad type name" },
  71.    { BUFOVER,     "buffer overflow" },
  72.    { CRASH,       "internal error" },
  73.    { DOUBLECONS,  "double use of constructor name" },
  74.    { DOUBLEFIELD, "double use of field name" },
  75.    { ERRDET,      "errors detected, program aborted" },
  76.    { EXTRATERM  , "unexpected termination command" },
  77.    { MISSINGPAR , "missing parameter" },
  78.    { NOCLOSEBRAC, "missing close bracket" },
  79.    { NOEXPR     , "missing expression" },
  80.    { NONAME     , "no name specified" },
  81.    { NOROOM,      "no room" },
  82.    { NOSEP      , "no separator" },
  83.    { NOSUCHCONS , "no such constructor" },
  84.    { NOSUCHELM  , "no such constructor element" },
  85.    { NOSUCHFN   , "no such function" },
  86.    { NOSUCHTYPE , "no such type" },
  87.    { NOTACONS   , "not a constructor type" },
  88.    { NOTATUPLE  , "not a tuple type" },
  89.    { NOUNDERSCORE, "No '_' allowed in name" },
  90.    { SYNTAXERR,   "syntax error" },
  91.    { TOOMANYARG , "excess function parameters" },
  92.    { UNEXPECTDOT, "unexpected dot command" },
  93.    { UNEXPECTEOF, "unexpected end of file" },
  94.    { UNEXPECTEOL, "unexpected end of line" },
  95.    { VARNOTFOUND, "variable not found" },
  96.    { ERREND, "" }
  97. };
  98.  
  99. /* Translate an error code 'no' into an error string using a translation
  100.    table 'tab'.  If the code is not known, return NULL.
  101.  
  102.    Each table is assumed to end with an entry with the special
  103.    code 'ERREND'. Tables without such an end mark will cause havoc.
  104.  */
  105. static char *finderrm( no, tab )
  106.  tmerrcode no;
  107.  struct errm *tab;
  108. {
  109.    while( tab->errmcode != ERREND ){
  110.       if( tab->errmcode == no ) return( tab->errmstr );
  111.       tab++;
  112.    }
  113.    return( NULL );
  114. }
  115.  
  116. /******************************************************
  117.  *                                                    *
  118.  *            ERROR HANDLERS                          *
  119.  *                                                    *
  120.  ******************************************************/
  121.  
  122. /* Initialize error handling routines. */
  123. void init_error()
  124. {
  125.    errarg[0] = '\0';
  126.    errpos[0] = '\0';
  127.    goterror = FALSE;
  128. }
  129.  
  130. /* General error printing routine: print error message possibly preceded
  131.    by string in 'errpos', and possibly followed by string in 'errarg'.
  132.    Set flag 'goterror' to indicate an error has occurred. At the next call to
  133.    errcheck() this flag will be checked, and the program will be stopped if
  134.    it was set.
  135.  */
  136. static void printerror( msg )
  137.  char *msg;
  138. {
  139.     if( errpos[0] != '\0' ) fprintf( stderr, "%s: ", errpos );
  140.     fputs( msg, stderr );
  141.     if( errarg[0] != '\0' ) fprintf( stderr, ": %s", errarg);
  142.     fputs( "\n", stderr );
  143.     errarg[0] = '\0';
  144.     errpos[0] = '\0';
  145.     goterror = TRUE;
  146. }
  147.  
  148. /* Given an error code 'no', search the table of error message ('tmerrtab')
  149.  * for that code, and print the string associated with the code. Complain
  150.  * if the error code is not known.
  151.  */
  152. void error( no )
  153.  tmerrcode no;
  154. {
  155.     char *errm;
  156.  
  157.     errm = finderrm( no, tmerrtab );
  158.     if( errm == NULL ){
  159.     (void) sprintf( errarg, "%d", no );
  160.     errm = "unknown error code";
  161.     }
  162.     printerror( errm );
  163. }
  164.  
  165. /* System error handler. */
  166. void sys_error( no )
  167.  int no;
  168. {
  169.     if( no>sys_nerr ){
  170.     (void) sprintf( errarg, "%d", no );
  171.     printerror( "unknown system error" );
  172.     }
  173.     else {
  174.     printerror( sys_errlist[no] );
  175.     }
  176. }
  177.  
  178. /* Error handler that supplies line number and file name from the
  179.    global variables 'tpllineno' and 'tplfilename'.
  180.  */
  181. void line_error( no )
  182.  int no;
  183. {
  184.     if( tplfilename == CHARNIL ){
  185.     (void) sprintf( errpos, "(%d)", tpllineno );
  186.     }
  187.     else {
  188.     (void) sprintf( errpos, "%s(%d)", tplfilename, tpllineno );
  189.     }
  190.     error( no );
  191. }
  192.  
  193. /* Internal error handler. Print the given message with number 'no'
  194.    with given position in the source: file name and line number.
  195.  */
  196. void docrash( file, line, no )
  197.  char *file;
  198.  int line;
  199.  int no;
  200. {
  201.    (void) sprintf( errpos, "internal error at %s(%d)", file, line );
  202.    error( no );
  203. }
  204.  
  205. /* Check if 'goterror' flag is set, and do exit(1) if it is. */
  206. void errcheck()
  207. {
  208.    if( !goterror ) return;
  209.    error( ERRDET );
  210.    exit( 1 );
  211. }
  212.